/*
 * AplicationManager.java
 *
 * Created on 13 de diciembre de 2007, 14:36
 *
 */

package es.team.tareas.management;

import es.team.util.Globals;
import es.team.exceptions.NoDataException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Victor Gimeno (SGV, SL)
 */
public class SessionManager {
    
    private static final String KEY_USER_CONTAINER = Globals.KEY_USER_CONTAINER;
    private static final String KEY_ERROR = org.apache.struts.Globals.ERROR_KEY;
    
    private HttpServletRequest currentRequest; 
    
    /** Crea una nueva instancia de AplicationManager
     * @param request request
     */
    public SessionManager(  HttpServletRequest request ) {
        
        this.currentRequest = request;
    }
       
    
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     * @return El nuevo contenedor de usuario generado
     */
    public final HttpSession resetSession(){
        
        /* Invalido la sesion existente si existe */
        HttpSession session = currentRequest.getSession(false);

        if( session != null ){
            session.invalidate();
        }

        /* Creo una nueva session para este usuario */
        session = currentRequest.getSession(true);
        
        return session;
    }
    
    public final void removeStrutsSessionErrors(){
        
        this.currentRequest.getSession().removeAttribute( KEY_ERROR );
    }
        
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     * @return El nuevo contenedor de usuario generado
     */
    public final HashMap resetSessionAndCreateUserContainer(){
        
        /* Invalido la sesion existente si existe */
        resetSession();
        
        /** Contenedor de session que usaremos durante el proceso de solicitud, para los datos del usuario. Se alojara en session.*/
        HashMap userContainer =  new HashMap();
        
        setUserContainer( userContainer );
        
        return userContainer;
    }
     
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     */
    public final void closeSession(){
        
        HashMap userContainer = removeUserContainer();
        
        /* Invalido la sesion existente si existe */
        currentRequest.getSession().invalidate();

        HttpSession session = currentRequest.getSession(true);
        
        //Aqui se meteria lo que hubiera que recomponer en la nueva sesion
    }
    
    /**
     * M�todo para obtener el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @return El contenedor con los datos de usuario
     * @throws NoDataException Si no se ha encontrado el contenedor de usuario.
     */
    public final HashMap getUserContainer() throws NoDataException{
        
        HashMap contenedor = (HashMap)currentRequest.getSession().getAttribute( KEY_USER_CONTAINER );
        
        if( contenedor == null ){
            System.out.println("buscando user container");
            throw new NoDataException("No se ha encontrado el contenedor de usuario " +
                    "con key [" + KEY_USER_CONTAINER + "] en session. ");
        }
        
        return contenedor;
        
    }
    
    /**
     * M�todo para establece el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @param container El objeto contenedor.
     */
    public final void setUserContainer( HashMap container ){
        
        currentRequest.getSession().setAttribute( KEY_USER_CONTAINER, container );
        
    }
    
    /**
     * M�todo para eliminar el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @return El contenedor eliminado.
     */
    public final HashMap removeUserContainer(){
        
        HashMap userContainer = (HashMap)currentRequest.getSession().getAttribute( KEY_USER_CONTAINER );
        currentRequest.getSession().removeAttribute( KEY_USER_CONTAINER );
        
        return userContainer;
    }
        
    /**
     * Metodo para guardar datos en el contenedor de session userContainer.
     * @param key Clave del dato a guardar
     * @param obj Dato a guardar.
     * @return True si ha ido bien, false en otro caso.
     */
    public final boolean putData( String key, Object obj ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer();
            
        } catch (Exception ex) {
            return false;
        }
        
        userContainer.put( key, obj );
        
        return true;
        
    }
    
    /**
     * Metodo para obtener datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object getData( String key ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer();
            
        } catch (Exception ex) {
            return null;
        }
        
        return userContainer.get( key );
        
    }
    
    /**
     * Metodo para eliminar datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object removeData( String key ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer();
            
        } catch (Exception ex) {
            return null;
        }
        
        return userContainer.remove( key );
        
    }
    
        /**
     * Metodo para guardar datos en el contenedor de session userContainer.
     * @param key Clave del dato a guardar
     * @param obj Dato a guardar.
     * @return True si ha ido bien, false en otro caso.
     */
    public final boolean putRequestAttribute( String key, Object obj ){
        
        currentRequest.setAttribute( key, obj );
        
        return true;
        
    }
    
    /**
     * Metodo para obtener parametros de la request
     * @param key Clave del dato a recuperar
     * @return String con el value obtenido
     */
    public final String getRequestParameter( String key ){
       
        return currentRequest.getParameter( key );
        
    }
    
    /**
     * Metodo para obtener datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object getRequestAttribute( String key ){
       
        return currentRequest.getAttribute( key );
        
    }
    
    /**
     * Metodo para eliminar datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object removeRequestAttribute( String key ){
                
        Object value = getRequestAttribute(key);
        
        currentRequest.removeAttribute(key);
        
        return value;
        
    }
    
    /**
     * Metodo para guardar datos en el contenedor de session userContainer.
     * @param key Clave del dato a guardar
     * @param obj Dato a guardar.
     * @return True si ha ido bien, false en otro caso.
     */
    public final boolean putSessionAttribute( String key, Object obj ){
        
        currentRequest.getSession().setAttribute( key, obj );
        
        return true;
        
    }
    
    /**
     * Metodo para obtener datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object getSessionAttribute( String key ){
       
        return currentRequest.getSession().getAttribute( key );
        
    }
    
    /**
     * Metodo para eliminar datos del contenedor de session userContainer.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public final Object removeSessionAttribute( String key ){
                
        Object value = getSessionAttribute(key);
        
        currentRequest.getSession().removeAttribute(key);
        
        return value;
        
    }
    
    // <editor-fold defaultstate="collapsed" desc="ACCESO ESTATICO">
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     * @param request El objeto de la peticion.
     * @return El nuevo contenedor de usuario generado
     */
    public static final HttpSession resetSession( HttpServletRequest request ){
        
        /* Invalido la sesion existente si existe */
        HttpSession session = request.getSession(false);

        if( session != null ){
            session.invalidate();
        }

        /* Creo una nueva session para este usuario */
        session = request.getSession(true);
        
        return session;
    }
        
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     * @param request El objeto de la peticion.
     * @return El nuevo contenedor de usuario generado
     */
    public static final HashMap resetSessionAndCreateUserContainer( HttpServletRequest request ){
        
        /* Invalido la sesion existente si existe */
        resetSession( request );
        
        /** Contenedor de session que usaremos durante el proceso de solicitud, para los datos del usuario. Se alojara en session.*/
        HashMap userContainer =  new HashMap();
        
        setUserContainer( request,  userContainer );
        
        return userContainer;
    }
     
    /**
     * Metodo que invalida la session actual, crea una nueva y establece el contenedor de usuario.
     * @param request El objeto de la peticion.
     */
    public static final void closeSession( HttpServletRequest request ){
        
        HashMap userContainer = SessionManager.removeUserContainer( request );
        
        /* Invalido la sesion existente si existe */
        request.getSession().invalidate();

        HttpSession session = request.getSession(true);
        
        //Aqui se meteria lo que hubiera que recomponer en la nueva sesion
    }
    
    /**
     * M�todo para obtener el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @param request El objeto de la peticion.
     * @return El contenedor con los datos de usuario
     * @throws NoDataException Si no se ha encontrado el contenedor de usuario.
     */
    public static final HashMap getUserContainer( HttpServletRequest request ) throws NoDataException{
        
        HashMap contenedor = (HashMap)request.getSession().getAttribute( KEY_USER_CONTAINER );
        
        if( contenedor == null ){
            throw new NoDataException("No se ha encontrado el contenedor de usuario " +
                    "con key [" + KEY_USER_CONTAINER + "] en session. ");
        }
        
        return contenedor;
        
    }
    
    /**
     * M�todo para establece el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @param request El objeto de la peticion.
     * @param container El objeto contenedor.
     */
    public static final void setUserContainer( HttpServletRequest request, HashMap container ){
        
        request.getSession().setAttribute( KEY_USER_CONTAINER, container );
        
    }
    
    /**
     * M�todo para eliminar el contenedor de usuario con la clave con la que se ha
     * configurado el modulo.
     * @param request El objeto de la peticion.
     * @return El contenedor eliminado.
     */
    public static final HashMap removeUserContainer( HttpServletRequest request ){
        
        HashMap userContainer = (HashMap)request.getSession().getAttribute( KEY_USER_CONTAINER );
        request.getSession().removeAttribute( KEY_USER_CONTAINER );
        
        return userContainer;
    }
        
    /**
     * Metodo para guardar datos en el contenedor de session userContainer.
     * @param request El objeto de la peticion.
     * @param key Clave del dato a guardar
     * @param obj Dato a guardar.
     * @return True si ha ido bien, false en otro caso.
     */
    public static final boolean putData( HttpServletRequest request, String key, Object obj ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer( request );
            
        } catch (Exception ex) {
            return false;
        }
        
        userContainer.put( key, obj );
        
        return true;
        
    }
    
    /**
     * Metodo para obtener datos del contenedor de session userContainer.
     * @param request El objeto de la peticion.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public static final Object getData( HttpServletRequest request, String key ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer( request );
            
        } catch (Exception ex) {
            return null;
        }
        
        return userContainer.get( key );
        
    }
    
    /**
     * Metodo para eliminar datos del contenedor de session userContainer.
     * @param request El objeto de la peticion.
     * @param key Clave del dato a recuperar
     * @return object con el value obtenido, null si no encontrado
     */
    public static final Object removeData( HttpServletRequest request, String key ){
        
        HashMap userContainer = null;
        
        try {
            userContainer = getUserContainer( request );
            
        } catch (Exception ex) {
            return null;
        }
        
        return userContainer.remove( key );
        
    }
    // </editor-fold>
}
